home *** CD-ROM | disk | FTP | other *** search
/ Power CD / Power CD ATARI-Rechner Lieben.iso / UTILITY / PROFILER / KOMPOSER.PRO < prev    next >
Encoding:
Text File  |  1989-06-16  |  7.8 KB  |  199 lines

  1. PROGRAM Computer_Composition; { 7. Bundeswettbewerb Informatik 1988/1989 }
  2.                               { 1. Runde,Aufgabe 1 ; Autor M.Berger      }
  3.                               {   Hinweise am Ende des Files beachten !  }
  4.   
  5.   CONST Max_Laenge_Motiv        = 20;
  6.         Max_Anzahl_Toene        = 10;
  7.         Max_Anzahl_Schritte     = 20;
  8.   TYPE  Abbildungsregel_DEF     = RECORD
  9.                                     Alt       : CHAR;
  10.                                     Neu       : CHAR;
  11.                                   END;
  12.         Wandlungs_ART    = (Thema,Variation);
  13.       
  14.   VAR   Satzform                         : ARRAY[1..Max_Anzahl_Schritte] OF
  15.                         {  SATZFORM : 112  }
  16.                                                  Wandlungs_ART;
  17.         Anzahl_Schritte                  : INTEGER;
  18.                         {  ANZAHL_SCHRITTE : 39  Min 0.  Max 5  }
  19.         Abbildungsregel                  : ARRAY[1..Max_Anzahl_Toene] 
  20.                         {  ABBILDUNGSREGEL : 2765  }
  21.                                                  OF Abbildungsregel_DEF;
  22.         Anzahl_Toene                     : INTEGER;
  23.                         {  ANZAHL_TOENE : 493  Min 0.  Max 6  }
  24.         Motiv                            : ARRAY[1..Max_Laenge_Motiv] OF
  25.                         {  MOTIV : 359  }
  26.                                                 CHAR;
  27.         Motivlaenge                           : INTEGER;
  28.                         {  MOTIVLAENGE : 105  Min 0.  Max 5  }
  29.         Prestofaktor                     : REAL;
  30.                         {  PRESTOFAKTOR : 3  Min 2  Max 2  }
  31.         Anzahl_Saetze                    : INTEGER;
  32.                         {  ANZAHL_SAETZE : 2  Min 3  Max 3  }
  33.         Tondauer                         : REAL;
  34.                         {  TONDAUER : 6  Min 0  Max 1  }
  35.         i                                : INTEGER;
  36.                         {  I : 0.  Min ---  Max ---  }
  37.         
  38.  PROCEDURE Eingabe;  { 1 }
  39.    VAR i : INTEGER;  {  I : 0.  Min ---  Max ---  }
  40.        x : CHAR;  {  X : 16  }
  41.    BEGIN
  42.      CLRSCR;WRITELN('Computer-Composition  (bwINF 7 [88/89];Aufgabe 1)');
  43.      WRITELN;WRITELN;
  44.      
  45.      Anzahl_Toene:=0;
  46.      REPEAT  { 6 }
  47.        Anzahl_Toene:=Anzahl_Toene+1;
  48.        WRITE('  Bitte Ton angeben : ');
  49.        READ(kbd,Abbildungsregel[Anzahl_Toene].Alt);
  50.        WRITE(Abbildungsregel[Anzahl_Toene].Alt);
  51.        IF Abbildungsregel[Anzahl_Toene].Alt<>' ' THEN  { 5 }
  52.        BEGIN
  53.          WRITE(' ; Wird abgebildet auf : ');
  54.          READ(kbd,Abbildungsregel[Anzahl_Toene].Neu);
  55.          WRITE(Abbildungsregel[Anzahl_Toene].NEU);
  56.        END;
  57.        WRITELN;
  58.      UNTIL (Anzahl_Toene=Max_Anzahl_Toene) OR 
  59.            (Abbildungsregel[Anzahl_Toene].Alt=' ');
  60.      Anzahl_Toene:=Anzahl_Toene-1;
  61.      WRITELN;
  62.      
  63.      Motivlaenge:=0;
  64.      REPEAT  { 5 }
  65.        Motivlaenge:=Motivlaenge+1;
  66.        WRITE('  Bitte Ton des Themas angeben : ');
  67.        READ(kbd,Motiv[Motivlaenge]);WRITELN(Motiv[Motivlaenge]);
  68.      UNTIL (Motiv[Motivlaenge]=' ') OR (Motivlaenge>Max_Laenge_Motiv);
  69.      Motivlaenge:=Motivlaenge-1;
  70.      WRITELN;
  71.      
  72.      Anzahl_Schritte:=0;
  73.      REPEAT  { 5 }
  74.        Anzahl_Schritte:=Anzahl_Schritte+1;
  75.        WRITE('  Soll Thema (u)nverändert bleiben oder (v)ariiert werden ');
  76.        READ(kbd,x);
  77.        WRITELN(x);
  78.        IF UPCASE(X)='V' THEN  { 2 }
  79.          Satzform[Anzahl_Schritte]:=Variation;
  80.        IF UPCASE(x)='U' THEN  { 2 }
  81.          Satzform[Anzahl_Schritte]:=Thema;
  82.      UNTIL ((UPCASE(x)<>'V') AND (UPCASE(x)<>'U')) OR
  83.            (Anzahl_Schritte>Max_Anzahl_Schritte);
  84.      Anzahl_Schritte:=Anzahl_Schritte-1;
  85.      WRITELN;
  86.      
  87.      WRITE('  Bitte Anzahl Sätze angeben : ');
  88.      READLN(Anzahl_Saetze);
  89.      
  90.      WRITE('  Bitte Tondauer im ersten Satz angeben : ');
  91.      READLN(Tondauer);
  92.      
  93.      WRITE('  Bitte Prestofaktor angeben : ');
  94.        READLN(Prestofaktor);
  95.    END;
  96.  PROCEDURE Gib_Saetze_aus;  { 1 }
  97.    VAR i,u : INTEGER;  {  I : 10  Min 1  Max 4  }  {  U : 15  Min 1  Max 5  }
  98.        x   : CHAR;  {  X : 3  }
  99.    
  100.    PROCEDURE bilde_Satz (Schachtelung,Variationen : INTEGER);  { 111 }
  101.                                   { Max. Rekursion: 3 }
  102.                         {  SCHACHTELUNG : 219  Min 0.  Max 3  }
  103.                         {  VARIATIONEN : 724  Min 0.  Max 3  }
  104.      
  105.      FUNCTION variiert (Note : Char) : Char ;  { 456 }  {  NOTE : 2280  }
  106.        VAR i : INTEGER;  {  I : 3192  Min 1  Max 6  }
  107.            x : CHAR;  {  X : 2736  }
  108.        BEGIN
  109.          FOR i:=1 TO Anzahl_Toene DO  { 2280 }
  110.            IF Abbildungsregel[i].Alt=Note THEN x:=Abbildungsregel[i].Neu;
  111.                                   { 456 }
  112.          variiert:=x;
  113.        END;
  114.      
  115.      VAR i,u    : INTEGER;  {  I : 555  Min 1  Max 5  }
  116.                         {  U : 280  Min 2  Max 4  }
  117.          x      : CHAR;  {  X : 1128  }
  118.      BEGIN
  119.        IF Schachtelung>0 THEN  { 27 }
  120.          FOR i:=1 TO Anzahl_Schritte DO  { 108 }
  121.            IF Satzform[i]=Thema THEN  { 54 }
  122.              bilde_Satz(Schachtelung-1,Variationen)
  123.                                   ELSE  { 54 }
  124.              bilde_Satz(Schachtelung-1,Variationen+1)
  125.        ELSE  { 84 }
  126.        BEGIN
  127.          FOR i:=1 TO Motivlaenge DO  { 336 }
  128.          BEGIN
  129.              x:=Motiv[i];
  130.              IF Variationen>0 THEN  { 280 }
  131.                FOR u:=1 TO Variationen DO  { 456 }
  132.                  x:=variiert(x);
  133.              WRITE(x);
  134.          END;
  135.          WRITE(' ');
  136.        END;
  137.      END;
  138.    
  139.    BEGIN
  140.      FOR i:=1 TO Anzahl_Saetze DO  { 3 }
  141.      BEGIN
  142.        CLRSCR;WRITE('Computer-Composition :  -');
  143.        FOR u:=1 TO Motivlaenge DO WRITE(Motiv[u]);  { 12 }
  144.        WRITE('- ; Satz ',i,' ; Tondauer : ');
  145.        IF i>1 THEN Tondauer:=Tondauer/Prestofaktor;  { 2 }
  146.        WRITELN(Tondauer:3:2);
  147.        WRITELN;WRITE(' ');
  148.        bilde_Satz(i,0);
  149.        READ(kbd,x);
  150.      END;
  151.    END;
  152.    
  153.  BEGIN
  154.    Eingabe;
  155.    Gib_Saetze_aus;
  156.  END.
  157. {
  158.  Problemstellung :
  159.  Sue Dama ist bekannt für ihre anspruchsvollen Kompositionen. Sie benutzt
  160.  immer nur die fünf Tonstufen C,D,F,G und A.
  161.  Zunächst gibt sie ein Thema aus n gleichlangen Tönen vor. Jede Tonstufe kann
  162.  dabei mehrfach, einfach oder gar nicht vorkommen. Ein Thema für n=4 ist
  163.  zum Beispiel "AGCA"
  164.  Weiter denkt sie sich eine Abbildungsregel zwischen den Tonstufen aus, deren
  165.  Anwendung auf das Thema automatisch eine Variation ergibt. Die Abbildungs-
  166.  regel " C->F,D->D,F->D,G->C,A->G " ergibt für das Beispielthema die Variation
  167.  "GCFG".
  168.  Jetzt wählt sie noch eine Satzform, die aus einer beliebigen Aneinanderreihung
  169.  von Thema und Variation besteht. Für die Satzform "Thema-Variation-Variation-
  170.  Thema" sieht der erste Satz ihrer Komposition im Beispiel nun so aus :
  171.  "AGCA GCFG GCFG AGCA".
  172.  Den zweiten Satz komponiert Sue Dama, indem sie den ganzen ersten Satz als
  173.  Thema nimmt, und die Abbildungsregel und die Abbildungsregel und die Satzform
  174.  darauf wiederholt. Für das Beispiel lautet der zweite Satz damit :
  175.  "AGCAAGCFGGCFGAGCAGCFGCFDCCFDCGCFGGCFGCFDCCFDCGCFGAGCAAGCFGGCFGAGCA".
  176.  Weil der zweite Satz viel mehr Töne hat alsder erste, spielt ihn Sue Dama um
  177.  einen Prestofaktor schneller. Ist der Prestofaktor etwa gleich 2.0, dann
  178.  dauern alle Töne nur halb so lang wie im vorhergehenden Satz.
  179.  Der dritte, noch schnellere Satz ergibt sich aus dem zweiten, ebenso wie der
  180.  zweite aus dem ersten Satz. Der vierte Satz ergibt sich analog aus dem dritten
  181.  usw.
  182.  Schreibe ein Programm, das im Stil von Sue Dama komponiert, wenn man ihm ein
  183.  Thema, eine Abbildungsregel, eine Satzform, die Anzahl der gewünschten Sätze,
  184.  die Tondauer im ersten Satz und einen Prestofaktor eingibt.
  185.  
  186.  Beispiel :
  187.  
  188.  Thema,Abbildungsregel und Satzform wie oben besprochen.
  189.  Anzahl Sätze : 3; Prestofaktor 2; Tonlänge am Anfang 1.
  190.  Ergebnisse wie oben angeführt.
  191.   
  192.  Besonderheiten :
  193.  
  194.  Rekursion, Variablen, IF-THEN-Strukturen ohne Semikolons/ENDs.
  195.  
  196. }
  197.  
  198.